<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>


    // 

    function Fn() {
        // {}
        // 实例化对象的原型属性     构造函数的原型对象
        // {}[[Prototype]]     =  Fn.prototype
        // this -> {}

        // 默认情况下 返回被创建的实例化对象 
        // return this; 

        // 自定义返回值
        // 如果返回值是值类型, 默认返回返回被创建的实例化对象 
        // return "hello";
        // return 100;
        // return true;
        // return null;
        // return undefined;

        // 如果返回值是引用类型, 返回该引用类型(对象)
        // return new String("hello");
        // return new Number(100);
        // return new Boolean(true);
        // return new Array(1, 4, 7, 8, 5, 2, 9, 6, 3);


        // 返回的引用类型(实例化对象 )  => 并不是构造函数Fn的实例化对象 => 无法使用Fn.prototype上的方法 

        // 是否可以改变实例化对象的原型指向? [[Prototype]]

        var arr = [1, 4, 7, 8, 5, 2, 9, 6, 3]; // arr[[Prototype]] => Array.prototype

        // 将arr[[Prototype]] -> 指向Fn.prototype -> 可以使用Fn.prototype上的属性和方法

        // 改变实例化对象的原型属性指向
        // (1) 通过老版本的原型属性 __proto__ 修改 (新版本=> [[Prototype]])
        // arr.__proto__ = Fn.prototype;

        // (2) 借助官方提供的方法
        // Object.setPrototypeOf(target,proto);  设置实例化对象的原型属性指向
        // target => 实例化对象
        // proto  => 原型属性的指向

        // Object.getPrototypeOf(target);  获取实例化对象的原型属性指向

        // console.log(Object.getPrototypeOf(arr)); //  Array.prototype

        Object.setPrototypeOf(arr, Fn.prototype);
        console.log(Object.getPrototypeOf(arr)); //  Fn.prototype

        return arr;  // 伪数组


    }

    Fn.prototype.each = function (callbackFn) { // callbackFn接收的函数
        // this -> 调用此方法的实例化对象

        // 遍历数组 每次循环时执行传入的函数
        for (var i = 0; i < this.length; i++) {
            var item = this[i];
            // i
            // this -> 原数组
            callbackFn(item, i, this);
        }
    }

    var res = new Fn();
    console.log(res);

    // 伪数组不能使用数组的方法
    // res.forEach(function (item, index, array) {
    //     console.log(item, index, array);
    // })


    // res.each(function (item, index, array) {
    //     console.log(item, index, array);
    // })

    // 伪数组转真数组
    var list = Array.from(res);
    console.log(list);

</script>

</html>